package wci.intermediate;

import java.util.List;

/**
 * <h1>ICodeNode</h1>
 *
 * <p>中间码-分析树的节点定义</p>
 *
 * <p>Copyright (c) 2009 by Ronald Mak</p>
 * <p>For instructional purposes only.  No warranties.</p>
 */
public interface ICodeNode
{
    /**
     * @return 节点类型
     */
    public ICodeNodeType getType();

    /**
     * @return 父节点
     */
    public ICodeNode getParent();

    /**
     * @param node 孩子节点
     * @return 成功后的孩子节点
     */
    public ICodeNode addChild(ICodeNode node);

    /**
     * @return 所有孩子节点
     */
    public List<ICodeNode> getChildren();

    /**
     * 设置属性
     * @param key 属性键
     * @param value 属性值
     */
    public void setAttribute(ICodeKey key, Object value);

    /**
     * @param key 属性键
     * @return the 属性值
     */
    public Object getAttribute(ICodeKey key);

    /**
     * <p>
     * 在分析过程中，很多节点可以复用，比如 if a > b.e.f then q = b.e.f <br>
     * 这里的b.e.f是一个子树表示，出现了两次，第二次直接用拷贝的就可以。<br>
     * 拷贝一般是深度拷贝操作，包含它本身所有属性和所有子节点的拷贝。
     * </p>
     * @return 当前节点的拷贝
     */
    public ICodeNode copy();
}
